if (priv->context)
gtk_style_context_cancel_animations (priv->context, NULL);
+
+ /* Unset pointer/window info */
+ g_object_set_qdata (G_OBJECT (widget), quark_pointer_window, NULL);
}
}
* @window: the new device window.
*
* Sets pointer window for @widget and @device. Does not ref @window.
- * Actually stores it on the #GdkScreen, but you don't need to know that.
*/
void
_gtk_widget_set_device_window (GtkWidget *widget,
GdkWindow *window)
{
GtkWidgetPrivate *priv;
- GdkScreen *screen;
GHashTable *device_window;
g_return_if_fail (GTK_IS_WIDGET (widget));
priv = widget->priv;
- if (!gtk_widget_get_realized (widget))
+ if (!gtk_widget_get_mapped (widget))
return;
- screen = gdk_window_get_screen (priv->window);
- device_window = g_object_get_qdata (G_OBJECT (screen), quark_pointer_window);
+ device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
- if (G_UNLIKELY (!device_window))
+ if (!device_window && window)
{
device_window = g_hash_table_new (NULL, NULL);
- g_object_set_qdata_full (G_OBJECT (screen),
+ g_object_set_qdata_full (G_OBJECT (widget),
quark_pointer_window,
device_window,
(GDestroyNotify) g_hash_table_destroy);
if (window)
g_hash_table_insert (device_window, device, window);
- else
- g_hash_table_remove (device_window, device);
+ else if (device_window)
+ {
+ g_hash_table_remove (device_window, device);
+
+ if (g_hash_table_size (device_window) == 0)
+ g_object_set_qdata (G_OBJECT (widget), quark_pointer_window, NULL);
+ }
}
/*
GdkDevice *device)
{
GtkWidgetPrivate *priv;
- GdkScreen *screen;
GHashTable *device_window;
- GdkWindow *window;
- GtkWidget *w;
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
g_return_val_if_fail (GDK_IS_DEVICE (device), NULL);
priv = widget->priv;
- if (!gtk_widget_get_realized (widget))
- return NULL;
-
- screen = gdk_window_get_screen (priv->window);
- device_window = g_object_get_qdata (G_OBJECT (screen), quark_pointer_window);
-
- if (G_UNLIKELY (!device_window))
- return NULL;
-
- window = g_hash_table_lookup (device_window, device);
-
- if (!window)
+ if (!gtk_widget_get_mapped (widget))
return NULL;
- gdk_window_get_user_data (window, (gpointer *) &w);
+ device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
- if (widget != w)
+ if (!device_window)
return NULL;
- return window;
+ return g_hash_table_lookup (device_window, device);
}
/*
_gtk_widget_list_devices (GtkWidget *widget)
{
GtkWidgetPrivate *priv;
- GdkScreen *screen;
GHashTableIter iter;
GHashTable *device_window;
GList *devices = NULL;
priv = widget->priv;
- if (!gtk_widget_get_realized (widget))
+ if (!gtk_widget_get_mapped (widget))
return NULL;
- screen = gdk_window_get_screen (priv->window);
- device_window = g_object_get_qdata (G_OBJECT (screen), quark_pointer_window);
+ device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
if (G_UNLIKELY (!device_window))
return NULL;
g_hash_table_iter_init (&iter, device_window);
while (g_hash_table_iter_next (&iter, &key, &value))
- {
- GdkDevice *device = key;
- GdkWindow *window = value;
- GtkWidget *w;
-
- if (window)
- {
- gdk_window_get_user_data (window, (gpointer *) &w);
-
- if (widget == w)
- devices = g_list_prepend (devices, device);
- }
- }
+ devices = g_list_prepend (devices, key);
return devices;
}